/*
    这个文件的作用是演示 pthread_key_create 函数的用法
    gcc -o thread_specific_data thread_specific_data.c -lpthread

在实时系统中的关键问题：

实时系统要求：

    确定性的执行时间
    避免锁操作
    最小化系统调用

线程ID方案：❌ 不符合实时要求

    查找时间不确定
    需要锁操作
    涉及系统调用

线程特定数据：✅ 符合实时要求

    固定时间的直接访问
    无锁操作
    纯用户空间操作
*/

#include <pthread.h>
#include <stdio.h>

// 全局钥匙 - 所有线程共用
pthread_key_t thread_id_key;

// 一个被多个线程调用的共享函数
void shared_function() {
    // 问题：这里如何知道是哪个线程在调用？
    
    // 方案1：无法使用全局变量，因为会冲突
    // 方案2：使用线程特定数据
    int id = (int)(long)pthread_getspecific(thread_id_key);
    printf("在共享函数中: 线程 %d 在调用\n", id);
}

// 所有线程都执行这个相同的函数
void* common_thread_func(void* arg) {
    int my_id = (int)(long)arg;  // 通过参数知道初始ID
    
    // 设置这个线程的ID
    pthread_setspecific(thread_id_key, (void*)(long)my_id);
    
    // 第一次直接获取
    int id = (int)(long)pthread_getspecific(thread_id_key);
    printf("线程%d: 初始设置完成\n", id);
    
    // 调用共享函数
    shared_function();
    
    // 再调用一次
    shared_function();
    
    return NULL;
}

int main() {
    pthread_t t1, t2, t3;
    
    // 创建全局钥匙（只做一次）
    pthread_key_create(&thread_id_key, NULL);
    
    // 创建三个线程，都执行相同的函数，但参数不同
    pthread_create(&t1, NULL, common_thread_func, (void*)1);
    pthread_create(&t2, NULL, common_thread_func, (void*)2);
    pthread_create(&t3, NULL, common_thread_func, (void*)3);
    
    // 等待线程结束
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    
    return 0;
}